#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
打包脚本 - 将Excel数据匹配工具打包成exe文件
使用PyInstaller进行打包
"""

import os
import sys
import subprocess
from pathlib import Path

def install_pyinstaller():
    """安装PyInstaller"""
    try:
        print("正在安装PyInstaller...")
        subprocess.run([sys.executable, "-m", "pip", "install", "pyinstaller"], check=True)
        print("PyInstaller安装成功！")
        return True
    except subprocess.CalledProcessError as e:
        print(f"安装PyInstaller失败: {e}")
        return False

def build_exe():
    """构建exe文件"""
    try:
        # 确保在正确的目录中
        os.chdir(Path(__file__).parent)
        
        # PyInstaller命令参数
        cmd = [
            "pyinstaller",
            "--onefile",  # 打包成单个exe文件
            "--windowed",  # 不显示控制台窗口
            "--name=Excel数据匹配工具",  # 指定exe文件名
            "--icon=icon.ico",  # 图标文件（如果有的话）
            "--add-data=requirements.txt;.",  # 包含requirements.txt
            "--hidden-import=pandas",
            "--hidden-import=openpyxl",
            "--hidden-import=xlrd",
            "--hidden-import=tkinter",
            "main.py"
        ]
        
        # 如果没有图标文件，移除图标参数
        if not Path("icon.ico").exists():
            cmd = [arg for arg in cmd if not arg.startswith("--icon")]
        
        print("开始打包...")
        print(f"执行命令: {' '.join(cmd)}")
        
        result = subprocess.run(cmd, capture_output=True, text=True)
        
        if result.returncode == 0:
            print("\n打包成功！")
            print("exe文件位置: dist/Excel数据匹配工具.exe")
            
            # 检查文件是否存在
            exe_path = Path("dist/Excel数据匹配工具.exe")
            if exe_path.exists():
                size_mb = exe_path.stat().st_size / (1024 * 1024)
                print(f"文件大小: {size_mb:.2f} MB")
            else:
                print("警告: exe文件未找到")
        else:
            print("\n打包失败！")
            print("错误信息:")
            print(result.stderr)
            
        return result.returncode == 0
        
    except Exception as e:
        print(f"打包过程中发生错误: {e}")
        return False

def clean_build_files():
    """清理构建文件"""
    try:
        import shutil
        
        # 删除构建目录
        if Path("build").exists():
            shutil.rmtree("build")
            print("已清理build目录")
            
        # 删除spec文件
        spec_files = list(Path(".").glob("*.spec"))
        for spec_file in spec_files:
            spec_file.unlink()
            print(f"已删除{spec_file}")
            
    except Exception as e:
        print(f"清理文件时发生错误: {e}")

def main():
    """主函数"""
    print("Excel数据匹配工具 - 打包脚本")
    print("=" * 40)
    
    # 检查是否安装了PyInstaller
    try:
        import PyInstaller
        print("PyInstaller已安装")
    except ImportError:
        print("PyInstaller未安装，正在安装...")
        if not install_pyinstaller():
            print("安装失败，请手动安装: pip install pyinstaller")
            return
    
    # 构建exe
    if build_exe():
        print("\n构建完成！")
        print("\n使用说明:")
        print("1. exe文件位于 dist 目录中")
        print("2. 可以将exe文件复制到任何位置运行")
        print("3. 首次运行可能需要一些时间来解压")
        
        # 询问是否清理构建文件
        try:
            choice = input("\n是否清理构建文件? (y/n): ").lower()
            if choice in ['y', 'yes', '是']:
                clean_build_files()
        except KeyboardInterrupt:
            print("\n用户取消操作")
    else:
        print("\n构建失败！")
        print("\n常见问题解决方案:")
        print("1. 确保所有依赖都已安装")
        print("2. 检查main.py文件是否存在")
        print("3. 尝试在虚拟环境中运行")

if __name__ == "__main__":
    main()